// pages/consult/consult.js
Page({

  /**
   * 页面的初始数据
   */
  data: {
    messages: [], // 存储聊天消息
    inputValue: '', // 输入框内容
    scrollTop: 0, // 用于控制滚动位置
    baiduApiKey: 'v8iv9Ox3ytOKnutV27hIyCn2', // <--- 恢复为之前的 API Key
    baiduSecretKey: 'jz7xuZHLm0b6UlxvUBgWpHioy2duYZr5', // <--- 恢复为之前的 Secret Key
    baiduAppId: '118893498', // <--- 在这里添加您的应用ID
    baiduAccessToken: null, // 存储从百度获取的access_token
    baiduTokenExpiresAt: 0, // access_token 的过期时间戳 (ms)
    isGettingToken: false, // 防止重复获取token的标志
    isWaitingForAI: false, // 防止重复发送消息的标志
  },

  /**
   * 生命周期函数--监听页面加载
   */
  onLoad(options) {
    // 尝试在加载时获取一次token
    this.getBaiduAccessTokenIfNeeded();
  },

  // 处理输入框内容变化
  onInput(e) {
    this.setData({
      inputValue: e.detail.value
    });
  },

  // 发送消息
  async sendMessage() { // 修改为异步函数并恢复isWaitingForAI逻辑
    if (this.data.isWaitingForAI) {
      wx.showToast({
        title: '请等待AI回复完成',
        icon: 'none'
      });
      return;
    }

    const content = this.data.inputValue.trim();
    if (!content) {
      return;
    }

    this.addMessage({
      type: 'user',
      content: content
    });

    this.setData({
      inputValue: ''
    });

    this.setData({ isWaitingForAI: true });
    try {
      await this.getBaiduAIResponse(content); // 调用百度AI回复
    } catch (error) {
      console.error("sendMessage error: ", error);
      this.addMessage({
        type: 'ai',
        content: '抱歉，AI服务暂时遇到问题，请稍后再试。'
      });
    } finally {
      this.setData({ isWaitingForAI: false });
    }
  },

  // 添加消息到列表并滚动
  addMessage(message) {
    const messages = this.data.messages.concat(message);
    this.setData({
      messages: messages,
    });
    // 延迟滚动，确保视图更新完毕
    setTimeout(() => {
      this.setData({
         scrollTop: messages.length * 1000 // 一个较大的值，确保滚动到底部
      });
    }, 100);
  },

  // ------------------- 百度文心千帆 API 相关逻辑 (恢复) -------------------

  // 获取百度 Access Token (如果需要)
  async getBaiduAccessTokenIfNeeded() {
    if (this.data.baiduAccessToken && Date.now() < this.data.baiduTokenExpiresAt) {
      console.log('Baidu Access Token is still valid.');
      return this.data.baiduAccessToken;
    }
    if (this.data.isGettingToken) {
      console.log('Already getting Baidu Access Token, please wait.');
      return new Promise(resolve => setTimeout(() => resolve(this.getBaiduAccessTokenIfNeeded()), 1000));
    }

    this.setData({ isGettingToken: true });
    console.log('Attempting to get Baidu Access Token...');

    const apiKey = this.data.baiduApiKey;
    const secretKey = this.data.baiduSecretKey;

    if (apiKey === '【您的百度云API Key】' || secretKey === '【您的百度云Secret Key】' || !apiKey || !secretKey) {
      console.error('请先在 pages/consult/consult.js 中配置您的百度云 API Key 和 Secret Key');
      this.addMessage({
        type: 'system',
        content: '错误：尚未配置有效的百度云API Key或Secret Key。'
      });
      this.setData({ isGettingToken: false });
      return null;
    }

    const tokenUrl = `https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=${apiKey}&client_secret=${secretKey}`;

    return new Promise((resolve, reject) => {
      wx.request({
        url: tokenUrl,
        method: 'POST',
        header: {
          'Content-Type': 'application/json',
          'Accept': 'application/json'
        },
        success: (res) => {
          console.log('Get Baidu Access Token Response:', res);
          if (res.statusCode === 200 && res.data && res.data.access_token) {
            const accessToken = res.data.access_token;
            const expiresIn = res.data.expires_in; // 通常是秒
            this.setData({
              baiduAccessToken: accessToken,
              baiduTokenExpiresAt: Date.now() + (expiresIn - 300) * 1000, // 提前 5 分钟过期
            });
            console.log('Successfully got Baidu Access Token:', accessToken);
            resolve(accessToken);
          } else {
            const errMsg = (res.data && res.data.error_description) ? res.data.error_description : '未知错误';
            console.error('Failed to get Baidu Access Token:', errMsg, res.data);
            this.addMessage({ type: 'system', content: `获取百度AccessToken失败: ${errMsg}` });
            reject(new Error(`获取百度AccessToken失败: ${errMsg}`));
          }
        },
        fail: (err) => {
          console.error('Request Baidu Access Token failed:', err);
          this.addMessage({ type: 'system', content: '请求百度AccessToken接口失败: ' + err.errMsg });
          reject(err);
        },
        complete: () => {
          this.setData({ isGettingToken: false });
        }
      });
    });
  },

  // 调用百度文心千帆大模型获取回复
  async getBaiduAIResponse(userInput) {
    let accessToken = this.data.baiduAccessToken;
    if (!accessToken || Date.now() >= this.data.baiduTokenExpiresAt) {
      try {
        this.addMessage({type: 'system', content: '正在更新AI服务凭证...'});
        accessToken = await this.getBaiduAccessTokenIfNeeded();
        if (!accessToken) {
          this.addMessage({ type: 'ai', content: '无法获取AI服务凭证，请稍后重试。' });
          return;
        }
        this.addMessage({type: 'system', content: 'AI服务凭证已更新。'});
      } catch (error) {
        this.addMessage({ type: 'ai', content: 'AI服务凭证获取失败，请检查网络或配置。' });
        return;
      }
    }
    
    // 请根据您在千帆平台选择的具体模型确认此URL
    // ERNIE-Bot-turbo: 'eb-instant'
    // ERNIE Lite: 'ernie-lite-8k'
    // ERNIE Speed: 'ernie_speed'
    // ERNIE 4.0 (预览版，如有权限): 'completions_pro' 或 'ernie-4.0-8k-preview' (具体看文档)
    // 假设使用 ERNIE-Bot-turbo (eb-instant)
    const chatAPI = `https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/completions_pro?access_token=${accessToken}`;
    
    const requestMessages = [{ role: 'user', content: userInput }];
    // 考虑加入历史消息以支持多轮对话
    // const historyMessages = this.data.messages
    //   .filter(msg => msg.type === 'user' || msg.type === 'ai')
    //   .slice(-6) // 取最近6条
    //   .map(msg => ({
    //     role: msg.type === 'user' ? 'user' : 'assistant',
    //     content: msg.content
    //   }));
    // const finalRequestMessages = [...historyMessages, { role: 'user', content: userInput }];
    // 注意百度API对messages格式的要求，user和assistant需交替，且第一条是user。

    // 修改这里，为思考中的消息添加 isLoading: true
    const thinkingMessage = { type: 'ai', content: '思考中...', isLoading: true };
    this.addMessage(thinkingMessage);
    const thinkingMessageIndex = this.data.messages.length - 1;

    console.log("Requesting Baidu AI with messages:", requestMessages);

    wx.request({
      url: chatAPI,
      method: 'POST',
      header: {
        'Content-Type': 'application/json'
      },
      data: {
        messages: requestMessages,
        // stream: false, // 小程序处理流式返回较复杂，默认为false
        // user_id: 'YOUR_UNIQUE_USER_ID' // 建议配置用户标识
      },
      success: (res) => {
        console.log('Baidu AI API Response:', res);
        let aiContent = 'AI回复解析失败或格式非预期。';
        if (res.statusCode === 200 && res.data) {
          if (res.data.error_code) {
            console.error('Baidu AI API Error:', res.data.error_msg);
            aiContent = `AI服务错误：${res.data.error_msg} (code: ${res.data.error_code})`;
          } else if (res.data.result) {
            aiContent = res.data.result;
          } else {
            console.warn('Baidu AI API Response format unexpected (no result or error_code):', res.data);
          }
        } else {
          console.error('Baidu AI API Request Failed or Bad Response:', res);
          aiContent = `AI服务请求失败，状态码：${res.statusCode}`;
        }
        
        const updatedMessages = [...this.data.messages];
        // 修改这里，确保替换的是正确的isLoading消息，并且清除isLoading标志
        if (updatedMessages[thinkingMessageIndex] && updatedMessages[thinkingMessageIndex].isLoading) {
            updatedMessages[thinkingMessageIndex].content = aiContent;
            updatedMessages[thinkingMessageIndex].isLoading = false; // 清除isLoading标志
            this.setData({ messages: updatedMessages });
        } else {
            this.addMessage({ type: 'ai', content: aiContent });
        }
      },
      fail: (err) => {
        console.error('Request Baidu AI API fail:', err);
        const updatedMessages = [...this.data.messages];
        // 修改这里，确保替换的是正确的isLoading消息，并且清除isLoading标志
         if (updatedMessages[thinkingMessageIndex] && updatedMessages[thinkingMessageIndex].isLoading) {
            updatedMessages[thinkingMessageIndex].content = '调用AI接口失败：' + err.errMsg;
            updatedMessages[thinkingMessageIndex].isLoading = false; // 清除isLoading标志
            this.setData({ messages: updatedMessages });
        } else {
            this.addMessage({ type: 'ai', content: '调用AI接口失败：' + err.errMsg });
        }
      },
      complete: () => {
         // isWaitingForAI 已经在 sendMessage 的 finally 中处理了
      }
    });
  },

  /**
   * 生命周期函数--监听页面初次渲染完成
   */
  onReady() {

  },

  /**
   * 生命周期函数--监听页面显示
   */
  onShow() {

  },

  /**
   * 生命周期函数--监听页面隐藏
   */
  onHide() {

  },

  /**
   * 生命周期函数--监听页面卸载
   */
  onUnload() {

  },

  /**
   * 页面相关事件处理函数--监听用户下拉动作
   */
  onPullDownRefresh() {

  },

  /**
   * 页面上拉触底事件的处理函数
   */
  onReachBottom() {

  },

  /**
   * 用户点击右上角分享
   */
  onShareAppMessage() {

  }
})